ஜாவாஸ்கிரிப்ட் நிகழ்வுச் சுழற்சி, பணி மற்றும் மைக்ரோடாஸ்க் வரிசைகளின் ஆழமான விளக்கம். ஒற்றை-திரி சூழலில் ஜாவாஸ்கிரிப்ட் எவ்வாறு ஒத்திசைவை அடைகிறது என்பதை நடைமுறை எடுத்துக்காட்டுகளுடன் விளக்குகிறது.
ஜாவாஸ்கிரிப்ட் நிகழ்வுச் சுழற்சியை எளிமையாக விளக்குதல்: பணி வரிசைகள் மற்றும் மைக்ரோடாஸ்க் நிர்வாகத்தைப் புரிந்துகொள்ளுதல்
ஜாவாஸ்கிரிப்ட் ஒரு ஒற்றை-திரி (single-threaded) மொழியாக இருந்தபோதிலும், ஒத்திசைவு மற்றும் ஒத்திசைவற்ற செயல்பாடுகளைத் திறமையாகக் கையாளுகிறது. இது மிகவும் நுட்பமான நிகழ்வுச் சுழற்சி (Event Loop) மூலம் சாத்தியமாகிறது. செயல்திறன் மிக்க மற்றும் வினைத்திறன் கொண்ட பயன்பாடுகளை எழுத விரும்பும் எந்தவொரு ஜாவாஸ்கிரிப்ட் டெவலப்பருக்கும் இது எவ்வாறு செயல்படுகிறது என்பதைப் புரிந்துகொள்வது முக்கியம். இந்த விரிவான வழிகாட்டி, நிகழ்வுச் சுழற்சியின் நுணுக்கங்களையும், குறிப்பாக பணி வரிசை (Task Queue அல்லது Callback Queue) மற்றும் மைக்ரோடாஸ்க் வரிசை (Microtask Queue) பற்றியும் ஆராயும்.
ஜாவாஸ்கிரிப்ட் நிகழ்வுச் சுழற்சி என்றால் என்ன?
நிகழ்வுச் சுழற்சி என்பது அழைப்பு அடுக்கு (call stack) மற்றும் பணி வரிசையை (task queue) தொடர்ந்து கண்காணிக்கும் ஒரு செயல்முறையாகும். அதன் முதன்மைப் பணி, அழைப்பு அடுக்கு காலியாக உள்ளதா என்பதைச் சரிபார்ப்பதுதான். அது காலியாக இருந்தால், நிகழ்வுச் சுழற்சி பணி வரிசையிலிருந்து முதல் பணியை எடுத்து, அதைச் செயல்படுத்த அழைப்பு அடுக்கில் சேர்க்கும். இந்த செயல்முறை முடிவில்லாமல் மீண்டும் மீண்டும் நிகழ்கிறது, இது ஜாவாஸ்கிரிப்டை ஒரே நேரத்தில் பல செயல்பாடுகளைக் கையாள்வது போல் தோற்றமளிக்க அனுமதிக்கிறது.
இதை ஒரு விடாமுயற்சியுள்ள பணியாளராகக் கற்பனை செய்யுங்கள், அவர் தொடர்ந்து இரண்டு விஷயங்களைச் சரிபார்க்கிறார்: "நான் தற்போது ஏதாவது வேலையில் இருக்கிறேனா (அழைப்பு அடுக்கு)?" மற்றும் "நான் செய்வதற்கு ஏதேனும் வேலைகள் காத்திருக்கின்றனவா (பணி வரிசை)?" பணியாளர் வேலையில்லாமல் இருந்தால் (அழைப்பு அடுக்கு காலியாக இருந்தால்) மற்றும் பணிகள் காத்திருந்தால் (பணி வரிசை காலியாக இல்லை என்றால்), பணியாளர் அடுத்த பணியை எடுத்து அதில் வேலை செய்யத் தொடங்குவார்.
சுருக்கமாக, நிகழ்வுச் சுழற்சி என்பது ஜாவாஸ்கிரிப்ட்டை தடையற்ற (non-blocking) செயல்பாடுகளைச் செய்ய அனுமதிக்கும் இயந்திரமாகும். அது இல்லாமல், ஜாவாஸ்கிரிப்ட் குறியீட்டை வரிசையாக மட்டுமே செயல்படுத்த முடியும். இது குறிப்பாக வலை உலாவிகள் மற்றும் Node.js சூழல்களில் I/O செயல்பாடுகள், பயனர் தொடர்புகள் மற்றும் பிற ஒத்திசைவற்ற நிகழ்வுகளைக் கையாளும்போது மோசமான பயனர் அனுபவத்திற்கு வழிவகுக்கும்.
அழைப்பு அடுக்கு (Call Stack): குறியீடு செயல்படுத்தப்படும் இடம்
அழைப்பு அடுக்கு (Call Stack) என்பது கடைசி-உள்ளே, முதல்-வெளியே (Last-In, First-Out - LIFO) கொள்கையைப் பின்பற்றும் ஒரு தரவுக் கட்டமைப்பாகும். இங்குதான் ஜாவாஸ்கிரிப்ட் குறியீடு உண்மையில் செயல்படுத்தப்படுகிறது. ஒரு செயல்பாடு (function) அழைக்கப்படும்போது, அது அழைப்பு அடுக்கில் சேர்க்கப்படுகிறது. அந்த செயல்பாடு அதன் வேலையை முடித்ததும், அது அடுக்கிலிருந்து அகற்றப்படுகிறது.
இந்த எளிய உதாரணத்தைக் கவனியுங்கள்:
function firstFunction() {
console.log('First function');
secondFunction();
}
function secondFunction() {
console.log('Second function');
}
firstFunction();
செயல்படுத்தப்படும்போது அழைப்பு அடுக்கு எப்படி இருக்கும் என்பது இங்கே:
- ஆரம்பத்தில், அழைப்பு அடுக்கு காலியாக உள்ளது.
firstFunction()அழைக்கப்பட்டு அடுக்கில் சேர்க்கப்படுகிறது.firstFunction()உள்ளே,console.log('First function')செயல்படுத்தப்படுகிறது.secondFunction()அழைக்கப்பட்டு அடுக்கில் (firstFunction()மீது) சேர்க்கப்படுகிறது.secondFunction()உள்ளே,console.log('Second function')செயல்படுத்தப்படுகிறது.secondFunction()முடிவடைந்து அடுக்கிலிருந்து அகற்றப்படுகிறது.firstFunction()முடிவடைந்து அடுக்கிலிருந்து அகற்றப்படுகிறது.- அழைப்பு அடுக்கு இப்போது மீண்டும் காலியாக உள்ளது.
ஒரு செயல்பாடு சரியான வெளியேறும் நிபந்தனை இல்லாமல் தன்னைத்தானே மீண்டும் மீண்டும் அழைத்தால், அது ஸ்டாக் ஓவர்ஃப்ளோ (Stack Overflow) பிழைக்கு வழிவகுக்கும், இதில் அழைப்பு அடுக்கு அதன் அதிகபட்ச அளவைத் தாண்டி, நிரலை செயலிழக்கச் செய்கிறது.
பணி வரிசை (Task Queue): ஒத்திசைவற்ற செயல்பாடுகளைக் கையாளுதல்
பணி வரிசை (Task Queue) (கால்பேக் வரிசை அல்லது மேக்ரோடாஸ்க் வரிசை என்றும் அழைக்கப்படுகிறது) என்பது நிகழ்வுச் சுழற்சியால் செயல்படுத்தப்படக் காத்திருக்கும் பணிகளின் ஒரு வரிசையாகும். இது போன்ற ஒத்திசைவற்ற செயல்பாடுகளைக் கையாளப் பயன்படுகிறது:
setTimeoutமற்றும்setIntervalகால்பேக்குகள்- நிகழ்வு கேட்பான்கள் (Event listeners) (எ.கா., கிளிக் நிகழ்வுகள், கீபிரஸ் நிகழ்வுகள்)
XMLHttpRequest(XHR) மற்றும்fetchகால்பேக்குகள் (நெட்வொர்க் கோரிக்கைகளுக்கு)- பயனர் தொடர்பு நிகழ்வுகள்
ஒரு ஒத்திசைவற்ற செயல்பாடு முடிந்ததும், அதன் கால்பேக் செயல்பாடு பணி வரிசையில் வைக்கப்படுகிறது. நிகழ்வுச் சுழற்சி பின்னர் இந்த கால்பேக்குகளை ஒவ்வொன்றாக எடுத்து, அழைப்பு அடுக்கு காலியாக இருக்கும்போது அவற்றைச் செயல்படுத்தும்.
இதை ஒரு setTimeout உதாரணத்துடன் விளக்குவோம்:
console.log('Start');
setTimeout(() => {
console.log('Timeout callback');
}, 0);
console.log('End');
நீங்கள் வெளியீடு இவ்வாறு இருக்கும் என்று எதிர்பார்க்கலாம்:
Start
Timeout callback
End
இருப்பினும், உண்மையான வெளியீடு:
Start
End
Timeout callback
இதற்கான காரணம் இங்கே:
console.log('Start')செயல்படுத்தப்பட்டு "Start" என அச்சிடப்படுகிறது.setTimeout(() => { ... }, 0)அழைக்கப்படுகிறது. தாமதம் 0 மில்லி விநாடிகள் என்றாலும், கால்பேக் செயல்பாடு உடனடியாக செயல்படுத்தப்படாது. அதற்கு பதிலாக, அது பணி வரிசையில் வைக்கப்படுகிறது.console.log('End')செயல்படுத்தப்பட்டு "End" என அச்சிடப்படுகிறது.- அழைப்பு அடுக்கு இப்போது காலியாக உள்ளது. நிகழ்வுச் சுழற்சி பணி வரிசையைச் சரிபார்க்கிறது.
setTimeout-லிருந்து வரும் கால்பேக் செயல்பாடு பணி வரிசையிலிருந்து அழைப்பு அடுக்கிற்கு மாற்றப்பட்டு செயல்படுத்தப்படுகிறது, இது "Timeout callback" என அச்சிடுகிறது.
இது 0ms தாமதத்துடன் கூட, setTimeout கால்பேக்குகள் தற்போதைய ஒத்திசைவான குறியீடு இயங்கி முடிந்த பின்னரே, ஒத்திசைவற்ற முறையில் செயல்படுத்தப்படுகின்றன என்பதை இது நிரூபிக்கிறது.
மைக்ரோடாஸ்க் வரிசை: பணி வரிசையை விட அதிக முன்னுரிமை
மைக்ரோடாஸ்க் வரிசை (Microtask Queue) என்பது நிகழ்வுச் சுழற்சியால் நிர்வகிக்கப்படும் மற்றொரு வரிசையாகும். தற்போதைய பணி முடிந்த உடனேயே, ஆனால் நிகழ்வுச் சுழற்சி மீண்டும் ரெண்டர் செய்வதற்கு அல்லது பிற நிகழ்வுகளைக் கையாளுவதற்கு முன்பு, கூடிய விரைவில் செயல்படுத்தப்பட வேண்டிய பணிகளுக்காக இது வடிவமைக்கப்பட்டுள்ளது. இதை பணி வரிசையுடன் ஒப்பிடும்போது அதிக முன்னுரிமை கொண்ட வரிசையாகக் கருதலாம்.
மைக்ரோடாஸ்க்களின் பொதுவான மூலங்கள்:
- பிராமிஸ்கள் (Promises): பிராமிஸ்களின்
.then(),.catch(), மற்றும்.finally()கால்பேக்குகள் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகின்றன. - மியூட்டேஷன் அப்சர்வர் (MutationObserver): DOM (Document Object Model)-ல் ஏற்படும் மாற்றங்களைக் கண்காணிக்கப் பயன்படுகிறது. மியூட்டேஷன் அப்சர்வர் கால்பேக்குகளும் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகின்றன.
process.nextTick()(Node.js): தற்போதைய செயல்பாடு முடிந்த பிறகு, ஆனால் நிகழ்வுச் சுழற்சி தொடர்வதற்கு முன்பு ஒரு கால்பேக்கை செயல்படுத்த திட்டமிடுகிறது. இது சக்திவாய்ந்ததாக இருந்தாலும், அதன் அதிகப்படியான பயன்பாடு I/O பணி முடக்கத்திற்கு வழிவகுக்கும்.queueMicrotask()(சமீபத்திய உலாவி API): ஒரு மைக்ரோடாஸ்க்கை வரிசையில் சேர்க்க ஒரு தரப்படுத்தப்பட்ட வழி.
பணி வரிசைக்கும் மைக்ரோடாஸ்க் வரிசைக்கும் உள்ள முக்கிய வேறுபாடு என்னவென்றால், நிகழ்வுச் சுழற்சி, பணி வரிசையிலிருந்து அடுத்த பணியை எடுப்பதற்கு முன்பு, மைக்ரோடாஸ்க் வரிசையில் உள்ள அனைத்து மைக்ரோடாஸ்க்களையும் செயல்படுத்தும். இது ஒவ்வொரு பணி முடிந்த உடனேயே மைக்ரோடாஸ்க்குகள் உடனடியாக செயல்படுத்தப்படுவதை உறுதி செய்கிறது, சாத்தியமான தாமதங்களைக் குறைத்து வினைத்திறனை மேம்படுத்துகிறது.
பிராமிஸ்கள் மற்றும் setTimeout சம்பந்தப்பட்ட இந்த உதாரணத்தைக் கவனியுங்கள்:
console.log('Start');
Promise.resolve().then(() => {
console.log('Promise callback');
});
setTimeout(() => {
console.log('Timeout callback');
}, 0);
console.log('End');
இதன் வெளியீடு:
Start
End
Promise callback
Timeout callback
இதன் விளக்கம் இங்கே:
console.log('Start')செயல்படுத்தப்படுகிறது.Promise.resolve().then(() => { ... })ஒரு தீர்க்கப்பட்ட பிராமிஸை உருவாக்குகிறது..then()கால்பேக் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகிறது.setTimeout(() => { ... }, 0)அதன் கால்பேக்கை பணி வரிசையில் சேர்க்கிறது.console.log('End')செயல்படுத்தப்படுகிறது.- அழைப்பு அடுக்கு காலியாக உள்ளது. நிகழ்வுச் சுழற்சி முதலில் மைக்ரோடாஸ்க் வரிசையைச் சரிபார்க்கிறது.
- பிராமிஸ் கால்பேக் மைக்ரோடாஸ்க் வரிசையிலிருந்து அழைப்பு அடுக்கிற்கு மாற்றப்பட்டு செயல்படுத்தப்படுகிறது, இது "Promise callback" என அச்சிடுகிறது.
- மைக்ரோடாஸ்க் வரிசை இப்போது காலியாக உள்ளது. நிகழ்வுச் சுழற்சி பின்னர் பணி வரிசையைச் சரிபார்க்கிறது.
setTimeoutகால்பேக் பணி வரிசையிலிருந்து அழைப்பு அடுக்கிற்கு மாற்றப்பட்டு செயல்படுத்தப்படுகிறது, இது "Timeout callback" என அச்சிடுகிறது.
இந்த உதாரணம், மைக்ரோடாஸ்க்குகள் (பிராமிஸ் கால்பேக்குகள்) பணிகளுக்கு (setTimeout கால்பேக்குகள்) முன்பு செயல்படுத்தப்படுகின்றன என்பதை தெளிவாகக் காட்டுகிறது, setTimeout தாமதம் 0 ஆக இருந்தாலும் கூட.
முன்னுரிமையின் முக்கியத்துவம்: மைக்ரோடாஸ்க்குகள் vs. டாஸ்க்குகள்
பணிகளை விட மைக்ரோடாஸ்க்குகளுக்கு முன்னுரிமை அளிப்பது ஒரு வினைத்திறன் மிக்க பயனர் இடைமுகத்தை பராமரிக்க மிகவும் முக்கியமானது. மைக்ரோடாஸ்க்குகள் பெரும்பாலும் DOM-ஐப் புதுப்பிக்க அல்லது முக்கியமான தரவு மாற்றங்களைக் கையாள கூடிய விரைவில் செயல்படுத்தப்பட வேண்டிய செயல்பாடுகளை உள்ளடக்கியது. பணிகளுக்கு முன்பு மைக்ரோடாஸ்க்குகளைச் செயல்படுத்துவதன் மூலம், உலாவி இந்த புதுப்பிப்புகள் விரைவாகப் பிரதிபலிக்கப்படுவதை உறுதிசெய்கிறது, இது பயன்பாட்டின் செயல்திறன் உணர்வை மேம்படுத்துகிறது.
உதாரணமாக, ஒரு சேவையகத்திலிருந்து பெறப்பட்ட தரவின் அடிப்படையில் UI-ஐப் புதுப்பிக்கும் சூழ்நிலையை கற்பனை செய்து பாருங்கள். தரவு செயலாக்கம் மற்றும் UI புதுப்பிப்புகளைக் கையாள பிராமிஸ்களைப் (மைக்ரோடாஸ்க் வரிசையைப் பயன்படுத்தும்) பயன்படுத்துவது, மாற்றங்கள் விரைவாகப் பயன்படுத்தப்படுவதை உறுதிசெய்கிறது, இது ஒரு மென்மையான பயனர் அனுபவத்தை வழங்குகிறது. இந்த புதுப்பிப்புகளுக்கு நீங்கள் setTimeout (பணி வரிசையைப் பயன்படுத்தும்) பயன்படுத்தினால், ஒரு குறிப்பிடத்தக்க தாமதம் ஏற்படலாம், இது குறைந்த வினைத்திறன் கொண்ட பயன்பாட்டிற்கு வழிவகுக்கும்.
பணி முடக்கம் (Starvation): மைக்ரோடாஸ்க்குகள் நிகழ்வுச் சுழற்சியைத் தடுக்கும்போது
மைக்ரோடாஸ்க் வரிசை வினைத்திறனை மேம்படுத்த வடிவமைக்கப்பட்டிருந்தாலும், அதை விவேகத்துடன் பயன்படுத்துவது அவசியம். நிகழ்வுச் சுழற்சியை பணி வரிசைக்குச் செல்ல அல்லது புதுப்பிப்புகளை ரெண்டர் செய்ய அனுமதிக்காமல், நீங்கள் தொடர்ந்து மைக்ரோடாஸ்க் வரிசையில் மைக்ரோடாஸ்க்குகளைச் சேர்த்தால், நீங்கள் பணி முடக்கத்தை (starvation) ஏற்படுத்தலாம். மைக்ரோடாஸ்க் வரிசை ஒருபோதும் காலியாகாமல் இருக்கும்போது இது நிகழ்கிறது. இது நிகழ்வுச் சுழற்சியைத் தடுத்து, மற்ற பணிகள் செயல்படுத்தப்படுவதைத் தடுக்கிறது.
இந்த உதாரணத்தைக் கவனியுங்கள் (முக்கியமாக Node.js போன்ற சூழல்களில் process.nextTick கிடைக்கும்போது இது பொருந்தும், ஆனால் கருத்தியல் ரீதியாக மற்ற இடங்களிலும் பொருந்தும்):
function starve() {
Promise.resolve().then(() => {
console.log('Microtask executed');
starve(); // மீண்டும் ஒரு மைக்ரோடாஸ்க்கை சேர்க்கிறது
});
}
starve();
இந்த எடுத்துக்காட்டில், starve() செயல்பாடு தொடர்ந்து புதிய பிராமிஸ் கால்பேக்குகளை மைக்ரோடாஸ்க் வரிசையில் சேர்க்கிறது. நிகழ்வுச் சுழற்சி இந்த மைக்ரோடாஸ்க்குகளை காலவரையின்றி செயலாக்குவதில் சிக்கிக்கொள்ளும், இது மற்ற பணிகள் செயல்படுத்தப்படுவதைத் தடுத்து, பயன்பாட்டை முடக்கக்கூடும்.
பணி முடக்கத்தைத் தவிர்க்க சிறந்த நடைமுறைகள்:
- ஒரே பணியில் உருவாக்கப்படும் மைக்ரோடாஸ்க்களின் எண்ணிக்கையைக் கட்டுப்படுத்துங்கள். நிகழ்வுச் சுழற்சியைத் தடுக்கக்கூடிய மைக்ரோடாஸ்க்களின் சுழற்சி முறைகளைத் தவிர்க்கவும்.
- குறைந்த முக்கியத்துவம் வாய்ந்த செயல்பாடுகளுக்கு
setTimeoutபயன்படுத்துவதைக் கருத்தில் கொள்ளுங்கள். ஒரு செயல்பாட்டிற்கு உடனடி செயல்படுத்தல் தேவையில்லை என்றால், அதை பணி வரிசைக்கு ஒத்திவைப்பது மைக்ரோடாஸ்க் வரிசை அதிகமாகச் சுமையேறுவதைத் தடுக்கலாம். - மைக்ரோடாஸ்க்களின் செயல்திறன் தாக்கங்கள் குறித்து கவனமாக இருங்கள். மைக்ரோடாஸ்க்குகள் பொதுவாக பணிகளை விட வேகமாக இருந்தாலும், அதிகப்படியான பயன்பாடு பயன்பாட்டு செயல்திறனை பாதிக்கலாம்.
நிஜ உலக எடுத்துக்காட்டுகள் மற்றும் பயன்பாட்டு வழக்குகள்
எடுத்துக்காட்டு 1: பிராமிஸ்களுடன் ஒத்திசைவற்ற பட ஏற்றுதல்
function loadImage(url) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject(new Error(`Failed to load image at ${url}`));
img.src = url;
});
}
// எடுத்துக்காட்டு பயன்பாடு:
loadImage('https://example.com/image.jpg')
.then(img => {
// படம் வெற்றிகரமாக ஏற்றப்பட்டது. DOM-ஐப் புதுப்பிக்கவும்.
document.body.appendChild(img);
})
.catch(error => {
// பட ஏற்றுதல் பிழையைக் கையாளவும்.
console.error(error);
});
இந்த எடுத்துக்காட்டில், loadImage செயல்பாடு ஒரு பிராமிஸைத் தருகிறது, அது படம் வெற்றிகரமாக ஏற்றப்பட்டால் தீர்க்கப்படும் அல்லது பிழை ஏற்பட்டால் நிராகரிக்கப்படும். .then() மற்றும் .catch() கால்பேக்குகள் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகின்றன, இது பட ஏற்றுதல் செயல்பாடு முடிந்த உடனேயே DOM புதுப்பிப்பு மற்றும் பிழை கையாளுதல் உடனடியாக செயல்படுத்தப்படுவதை உறுதி செய்கிறது.
எடுத்துக்காட்டு 2: டைனமிக் UI புதுப்பிப்புகளுக்கு MutationObserver-ஐப் பயன்படுத்துதல்
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
console.log('Mutation observed:', mutation);
// மாற்றத்தின் அடிப்படையில் UI-ஐப் புதுப்பிக்கவும்.
});
});
const elementToObserve = document.getElementById('myElement');
observer.observe(elementToObserve, {
attributes: true,
childList: true,
subtree: true
});
// பின்னர், உறுப்பை மாற்றவும்:
elementToObserve.textContent = 'New content!';
MutationObserver DOM-ல் ஏற்படும் மாற்றங்களைக் கண்காணிக்க உங்களை அனுமதிக்கிறது. ஒரு மாற்றம் நிகழும்போது (எ.கா., ஒரு பண்பு மாற்றப்படும்போது, ஒரு குழந்தை முனை சேர்க்கப்படும்போது), MutationObserver கால்பேக் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகிறது. இது DOM மாற்றங்களுக்குப் பதிலளிக்கும் விதமாக UI விரைவாகப் புதுப்பிக்கப்படுவதை உறுதி செய்கிறது.
எடுத்துக்காட்டு 3: Fetch API உடன் நெட்வொர்க் கோரிக்கைகளைக் கையாளுதல்
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
// தரவைச் செயலாக்கி UI-ஐப் புதுப்பிக்கவும்.
})
.catch(error => {
console.error('Error fetching data:', error);
// பிழையைக் கையாளவும்.
});
Fetch API என்பது ஜாவாஸ்கிரிப்டில் நெட்வொர்க் கோரிக்கைகளைச் செய்வதற்கான ஒரு நவீன வழியாகும். .then() கால்பேக்குகள் மைக்ரோடாஸ்க் வரிசையில் சேர்க்கப்படுகின்றன, இது பதில் பெறப்பட்ட உடனேயே தரவு செயலாக்கம் மற்றும் UI புதுப்பிப்புகள் செயல்படுத்தப்படுவதை உறுதி செய்கிறது.
Node.js நிகழ்வுச் சுழற்சி பரிசீலனைகள்
Node.js-ல் உள்ள நிகழ்வுச் சுழற்சி உலாவிச் சூழலைப் போலவே செயல்படுகிறது, ஆனால் சில குறிப்பிட்ட அம்சங்களைக் கொண்டுள்ளது. Node.js libuv நூலகத்தைப் பயன்படுத்துகிறது, இது நிகழ்வுச் சுழற்சியின் ஒரு செயலாக்கத்தையும் ஒத்திசைவற்ற I/O திறன்களையும் வழங்குகிறது.
process.nextTick(): முன்னர் குறிப்பிட்டபடி, process.nextTick() என்பது Node.js-க்கு குறிப்பிட்ட ஒரு செயல்பாடாகும், இது தற்போதைய செயல்பாடு முடிந்த பிறகு, ஆனால் நிகழ்வுச் சுழற்சி தொடர்வதற்கு முன்பு ஒரு கால்பேக்கை செயல்படுத்த உங்களை அனுமதிக்கிறது. process.nextTick() உடன் சேர்க்கப்பட்ட கால்பேக்குகள், மைக்ரோடாஸ்க் வரிசையில் உள்ள பிராமிஸ் கால்பேக்குகளுக்கு முன்பு செயல்படுத்தப்படுகின்றன. இருப்பினும், பணி முடக்கம் ஏற்பட வாய்ப்பிருப்பதால், process.nextTick() குறைவாகவே பயன்படுத்தப்பட வேண்டும். queueMicrotask() கிடைக்கும்போது அது பொதுவாக விரும்பப்படுகிறது.
setImmediate(): setImmediate() செயல்பாடு நிகழ்வுச் சுழற்சியின் அடுத்த சுழற்சியில் செயல்படுத்தப்பட ஒரு கால்பேக்கை திட்டமிடுகிறது. இது setTimeout(() => { ... }, 0) போன்றது, ஆனால் setImmediate() I/O தொடர்பான பணிகளுக்காக வடிவமைக்கப்பட்டுள்ளது. setImmediate() மற்றும் setTimeout(() => { ... }, 0) ஆகியவற்றுக்கு இடையேயான செயல்படுத்தும் வரிசை கணிக்க முடியாததாக இருக்கலாம் மற்றும் இது கணினியின் I/O செயல்திறனைப் பொறுத்தது.
திறமையான நிகழ்வுச் சுழற்சி நிர்வாகத்திற்கான சிறந்த நடைமுறைகள்
- முக்கிய திரியைத் தடுப்பதைத் தவிர்க்கவும். நீண்ட நேரம் இயங்கும் ஒத்திசைவான செயல்பாடுகள் நிகழ்வுச் சுழற்சியைத் தடுக்கலாம், இது பயன்பாட்டை வினைத்திறனற்றதாக மாற்றும். முடிந்தவரை ஒத்திசைவற்ற செயல்பாடுகளைப் பயன்படுத்தவும்.
- உங்கள் குறியீட்டை மேம்படுத்துங்கள். திறமையான குறியீடு வேகமாகச் செயல்படும், இது அழைப்பு அடுக்கில் செலவிடும் நேரத்தைக் குறைத்து, நிகழ்வுச் சுழற்சி அதிக பணிகளைச் செயலாக்க அனுமதிக்கிறது.
- ஒத்திசைவற்ற செயல்பாடுகளுக்கு பிராமிஸ்களைப் பயன்படுத்தவும். பாரம்பரிய கால்பேக்குகளுடன் ஒப்பிடும்போது, பிராமிஸ்கள் ஒத்திசைவற்ற குறியீட்டைக் கையாள ஒரு சுத்தமான மற்றும் நிர்வகிக்கக்கூடிய வழியை வழங்குகின்றன.
- மைக்ரோடாஸ்க் வரிசை குறித்து கவனமாக இருங்கள். பணி முடக்கத்திற்கு வழிவகுக்கும் அதிகப்படியான மைக்ரோடாஸ்க்குகளை உருவாக்குவதைத் தவிர்க்கவும்.
- கணக்கீட்டு ரீதியாகச் சிக்கலான பணிகளுக்கு வெப் வொர்க்கர்களைப் (Web Workers) பயன்படுத்தவும். வெப் வொர்க்கர்கள் ஜாவாஸ்கிரிப்ட் குறியீட்டைத் தனித்தனி திரிகளில் இயக்க அனுமதிக்கின்றன, இது முக்கிய திரி தடுக்கப்படுவதைத் தடுக்கிறது. (உலாவிச் சூழலுக்கு மட்டும்)
- உங்கள் குறியீட்டை சுயவிவரப்படுத்துங்கள் (Profile). செயல்திறன் சிக்கல்களைக் கண்டறிந்து உங்கள் குறியீட்டை மேம்படுத்த உலாவி டெவலப்பர் கருவிகள் அல்லது Node.js சுயவிவரக் கருவிகளைப் பயன்படுத்தவும்.
- நிகழ்வுகளை டிபவுன்ஸ் (Debounce) மற்றும் த்ராட்டில் (Throttle) செய்யவும். அடிக்கடி நிகழும் நிகழ்வுகளுக்கு (எ.கா., ஸ்க்ரோல் நிகழ்வுகள், அளவு மாற்ற நிகழ்வுகள்), நிகழ்வு கையாளுதல் செயல்படுத்தப்படும் எண்ணிக்கையைக் கட்டுப்படுத்த டிபவுன்சிங் அல்லது த்ராட்டலிங்கைப் பயன்படுத்தவும். இது நிகழ்வுச் சுழற்சியின் மீதான சுமையைக் குறைப்பதன் மூலம் செயல்திறனை மேம்படுத்தும்.
முடிவுரை
ஜாவாஸ்கிரிப்ட் நிகழ்வுச் சுழற்சி, பணி வரிசை மற்றும் மைக்ரோடாஸ்க் வரிசை ஆகியவற்றைப் புரிந்துகொள்வது செயல்திறன் மிக்க மற்றும் வினைத்திறன் கொண்ட ஜாவாஸ்கிரிப்ட் பயன்பாடுகளை எழுத அவசியம். நிகழ்வுச் சுழற்சி எவ்வாறு செயல்படுகிறது என்பதைப் புரிந்துகொள்வதன் மூலம், ஒத்திசைவற்ற செயல்பாடுகளை எவ்வாறு கையாள்வது மற்றும் சிறந்த செயல்திறனுக்காக உங்கள் குறியீட்டை எவ்வாறு மேம்படுத்துவது என்பது குறித்த தகவலறிந்த முடிவுகளை நீங்கள் எடுக்கலாம். மைக்ரோடாஸ்க்குகளுக்கு சரியான முன்னுரிமை அளிக்கவும், பணி முடக்கத்தைத் தவிர்க்கவும், முக்கிய திரியைத் தடுக்கும் செயல்பாடுகளிலிருந்து எப்போதும் விடுபடவும் நினைவில் கொள்ளுங்கள்.
இந்த வழிகாட்டி ஜாவாஸ்கிரிப்ட் நிகழ்வுச் சுழற்சியின் விரிவான கண்ணோட்டத்தை வழங்கியுள்ளது. இங்கு கோடிட்டுக் காட்டப்பட்டுள்ள அறிவு மற்றும் சிறந்த நடைமுறைகளைப் பயன்படுத்துவதன் மூலம், சிறந்த பயனர் அனுபவத்தை வழங்கும் வலுவான மற்றும் திறமையான ஜாவாஸ்கிரிப்ட் பயன்பாடுகளை நீங்கள் உருவாக்க முடியும்.